package com.bjpowernode.springboot.controller;


import com.bjpowernode.springboot.entity.BookBean;
import com.bjpowernode.springboot.entity.LoginErrorBean;
import com.bjpowernode.springboot.entity.PageBean;
import com.bjpowernode.springboot.entity.UserBean;
import com.bjpowernode.springboot.service.BookService;
import com.bjpowernode.springboot.service.UserService;
import com.bjpowernode.springboot.utils.UserBeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 实现登录控制层
 */
@RequestMapping(value = "/do-login")
@Controller
public class LoginControler {

    @Autowired
    private LoginErrorBean loginErrorBean; // 注入登录错误实体bean

    @Autowired
    private UserService userService; // 注入user的service层对象

    @Autowired
    private BookService bookService;


    /**
     * 注意：如果此时返回的是空，当前的thmyleaf是无法解析的，页面会抛出500错误，因为此时不知道要跳转到那个页面
     * 控制套会抛出Error resolving template [], template might not exist or might not be accessi-
     * ble by any of the configured Template Resolvers site:blog.csdn.net
     * @return
     */
    /**
     * 实现用户的登录操作
     * 1. 判断用户是否直接登录
     *    如果选择，我们需要判断当前的用户是否已经登录过，即从本地cookie中获取第一次登录的cookie信息
     *    然后比对当前用户在输入框中的输入，匹配成功，直接进入数据展示页面，此时就不需要走数据库，减少
     *    后台与数据库的交互
     *    当然我们可以给cookie设置一个过期时间（第一次登录的时间，给定一个过期时间timeout）
     *    每次我们获取当前的时间然后减掉第一次登录的时间，如果这diff大于给定的timeout，过期，需要重新登录
     *
     *    如果用户是第一次登录，我们返回一个提示页面：告诉用户之前没有登录或者登录过期，需要重新登录，在
     *    该页面中用户可以进行手动跳转到登录页面，或者等5s自动跳转
     *    实际上还可缓存以将第一次登录信息放进redis中，每次先走redis，在走mysql
     * 2. 没有选择直接登录，按照常规的方式，此时需要走mysql，在第一次登录之后，将登录信息记录在cookie中
     * @return
     */
    @RequestMapping(value = "/login")
    public ModelAndView do_login(HttpServletRequest request) {
        // 创建视图数据对象
        ModelAndView mv = new ModelAndView();

        // 获取用户的输入
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String checkbox = request.getParameter("checkbox");

        // 判断输入是否为空
        if ("".equals(username) || "".equals(password)) {
            mv.addObject(loginErrorBean.getLOGIN_MESSAGE_ERROR(),loginErrorBean.getINPUT_NULL());
            mv.setViewName("login-error");
            return mv;
        }

        // 判断是否可以自动登录，走缓存（redis）
        if ("true".equals(checkbox)) {
            boolean isLogined = userService.isLogined(username,password);
            if (isLogined) {
                // 之前登录过
                mv.setViewName("show-data");
                return mv;
            }
        }

        // 从数据库实现登录
        UserBean userBean = new UserBean();
        HashMap<String, Object> userMap = new HashMap<>();
        userMap.put("username",username);
        userMap.put("password",password);
        UserBeanUtils.UserBeanPopulate(userBean,userMap); // 封装信息到UserBean中

        // 从数据库中查询该用户是否存在，如果不存在，跳转到注册页面进行注册
        UserBean queryUser = userService.queryUserByUserInfo(userBean); // 通过用户信息查询
        if (queryUser == null) {
            // 有两种情况：1. 输入有误 2. 本来就不存在
            // 1. 输入有误？ 如何判断是否为输入有误 没发判断？
            // 因为如果是第一次登录，之前是没有任何记录的，当前输入的信息没有参看的信息可以比较，无法确定是输入有误还是没有注册
            // 目前没有先出来如何实现?
            mv.addObject(loginErrorBean.getLOGIN_MESSAGE_ERROR(),loginErrorBean.getINPUT_ERROR());
            mv.setViewName("login-error");
            return mv;
        }
        // 当前用户信息正确，将用户信息缓存到redis中
        // redis中的数据结构采用：hash   userId-->{"username":username}{"password":password}
        userService.cacheUserBeanToRedis(queryUser); // 将用户信息缓存到redis中
        PageBean pageBean = new PageBean(1);
        List<BookBean> bookBeanList = bookService.queryBookByInterval(pageBean);
        mv.addObject("bookLists",bookBeanList);
        mv.setViewName("show-data-test");
        return mv;
    }


}
